package com.example.java_gobang.api;

import com.example.java_gobang.game.MatchRequest;
import com.example.java_gobang.game.MatchResponse;
import com.example.java_gobang.game.Matcher;
import com.example.java_gobang.game.OnlineUserManager;
import com.example.java_gobang.model.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

//处理websocket请求
@Component
public class MatchAPI extends TextWebSocketHandler {
    private ObjectMapper objectMapper = new ObjectMapper();
    @Autowired
    private OnlineUserManager onlineUserManager;
    @Autowired
    private Matcher matcher;
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {

        //玩家上线，加入 OnlineUserManager 中

        //  获取玩家身份信息（哪个玩家在游戏大厅中 建立了连接）
        //   (注意！！！可能出现玩家身份信息为空的现象----玩家直接通过 /game_hall.html 进入游戏大厅
        try {
            User user = (User) session.getAttributes().get("user");
            //判断当前用户是否已经登录，禁止多开
            WebSocketSession webSocketSession = onlineUserManager.getFromGameHall(user.getUserId());
            if( webSocketSession != null || onlineUserManager.getFromGameRoom(user.getUserId()) != null){
                MatchResponse response = new MatchResponse();
                response.setOk(true);
                response.setReason("此用户已登录！ 禁止重复登录！");
                response.setMessage("repeatConnection");
                session.sendMessage(new TextMessage(objectMapper.writeValueAsString(response)));
                //session.close();//连接断开
                return;
            }

            //  把该玩家设置为上线状态
            onlineUserManager.enterGameHall(user.getUserId(),session);
            System.out.println("玩家"+user.getUsername()+"进入游戏大厅！");
        }catch (NullPointerException e){
            e.printStackTrace();
            //把 当前用户未登录 这个信息返回回去
            MatchResponse response = new MatchResponse();
            response.setOk(false);
            response.setReason("您尚未登录！ 不能进行匹配！");
            session.sendMessage(new TextMessage(objectMapper.writeValueAsString(response)));
            //TextMessage--一个文本格式的websocket数据 通过ObjectMapper把对象转成JSON字符串!
        }

    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {

        //
        User user = (User) session.getAttributes().get("user");
        //  获取客户端发送的数据
        String payload = message.getPayload();
        //  把这个JSON格式的字符串转成JAVA对象
        MatchRequest request = objectMapper.readValue(payload,MatchRequest.class);
        MatchResponse response = new MatchResponse();
        if (request.getMessage().equals("startMatch")){
            //TODO 创建一个类表示匹配队列，把当前用户加进去
            matcher.add(user);

            //返回一个响应给客户端
            response.setOk(true);
            response.setMessage("startMatch");
        } else if (request.getMessage().equals("stopMatch")) {
            //TODO 把当前用户从匹配队列移除
            matcher.remove(user);

            //返回响应给客户端
            response.setOk(true);
            response.setMessage("stopMatch");
        }else {
            response.setOk(false);
            response.setMessage("匹配请求错误");
        }
        //TODO 不要忘记发送
        session.sendMessage(new TextMessage(objectMapper.writeValueAsString(response)));
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {

        try {
            //玩家下线，移除
            User user = (User) session.getAttributes().get("user");
            //  把该玩家设置为下线状态
            onlineUserManager.exitGameHall(user.getUserId());
            //System.out.println("玩家"+user.getUsername()+"退出游戏大厅！");
            matcher.remove(user);//玩家正在匹配中，连接断开，移除玩家
        }catch (NullPointerException e){
            e.printStackTrace();
//            //把 当前用户未登录 这个信息返回回去
//            MatchResponse response = new MatchResponse();
//            response.setOk(false);
//            response.setReason("您尚未登录！ 不能进行匹配！");
//            session.sendMessage(new TextMessage(objectMapper.writeValueAsString(response)));
//            //TextMessage--一个文本格式的websocket数据 通过ObjectMapper把对象转成JSON字符串!
        }

    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {

        try {
            //玩家下线，移除
            User user = (User) session.getAttributes().get("user");
            //  把该玩家设置为下线状态
            // 避免移除多开情况时，错误删除
            WebSocketSession webSocketSession = onlineUserManager.getFromGameHall(user.getUserId());
            if (webSocketSession == session){
                onlineUserManager.exitGameHall(user.getUserId());
            }
            matcher.remove(user);//玩家正在匹配中，连接断开，移除玩家

        }catch (NullPointerException e){
            e.printStackTrace();
            //连接已经关闭，不应该再发送信息给客户端
//            //把 当前用户未登录 这个信息返回回去
//            MatchResponse response = new MatchResponse();
//            response.setOk(false);
//            response.setReason("您尚未登录！ 不能进行匹配！");
//            session.sendMessage(new TextMessage(objectMapper.writeValueAsString(response)));
//            //TextMessage--一个文本格式的websocket数据 通过ObjectMapper把对象转成JSON字符串!
        }

    }
}
